<!DOCTYPE html>
<html>
<head>
<title>Febit Wit (Webit Script)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="Shortcut Icon" href="favicon.ico" />
<link rel="stylesheet" href="css/css.css" media="screen"/>
</head>
<body>
<div class="navbar navbar-default navbar-fixed-top">
<div class="ws-container">
<div class="navbar-header">
<a href="index.html" class="navbar-brand">Febit Wit</a>
</div>
<div id="navbar-main" class="navbar-collapse">
<ul class="nav navbar-nav">
<li><a href="index.html">简介</a></li>
<li><a href="example.html">示例</a></li>
<li><a href="syntax.html">语法</a></li>
<li><a href="props.html">配置</a></li>
<li><a href="integration.html">集成</a></li>
<li><a href="libapi.html">库/API</a></li>
<li><a href="faq.html">常见问题</a></li>
<li><a href="https://github.com/zqq90/zqq90.github.io/archive/master.zip" style="color: #fae413" target="_blank">下载本文档</a></li>
</div>
</div>
</div>
<div class="ws-container ws-doc-main-body"><div class="ws-sidenav"><ul class="nav"><li><a href="#section">标准库/第三方库 使用方法</a></li><li><a href="#jsp-taglib-function">使用JSP TagLib Function</a></li><li><a href="#section-1">缺省全局常量/函数</a></li><li><a href="#lib-assertwim">标准库：lib-assert.wim</a></li><li><a href="#lib-typewim">标准库：lib-type.wim</a></li><li><a href="#lib-tldwim">类型库：lib-tld.wim</a></li><li><a href="#lib-cachewim">标准库：lib-cache.wim</a></li><li><a href="#section-4">自定义函数库</a></li></ul></div><div class="ws-doc-body" ><h2 id="section">标准库/第三方库 使用方法</h2>

<blockquote>
  <p>只需要在配置文件里添加该库的配置文件，如：</p>
</blockquote>

<pre>## 用换行或者逗号（,）作为分隔符
@modules='''
  lib-assert.wim
  mylib-base.props
  lib-cache.wim
'''
</pre>

<h2 id="jsp-taglib-function">使用JSP TagLib Function</h2>

<blockquote>
  <p>引入wit-tools-[version].jar 包</p>
</blockquote>

<blockquote>
  <p>配置文件添加TLD的全局变量注册器，并配置该注册器：</p>
</blockquote>

<pre>[global]
registers+= webit.script.tools.tld.TLDGlobalRegister-example

[webit.script.tools.tld.TLDGlobalRegister-example]
# TLD 文件名，相对于ClassPath下的META-INF的地址
tld=example-fn.tld
# 导入时，给每个函数添加的前缀，默认为空
prefix=pre_
</pre>

<h2 id="section-1">缺省全局常量/函数</h2>

<h3 id="global">$GLOBAL</h3>
<blockquote>
  <p>缺省提供的全局常量，是个线程安全的Map，可以动态存放全局共享变量</p>
</blockquote>

<h3 id="localkey-localkey-value">LOCAL(key), LOCAL(key, value)</h3>
<blockquote>
  <p>缺省提供的全局函数，可以动态存放渲染会话级别的全局共享变量，每个渲染会话间独立，可在模板、调用的子模版、全局函数间传递变量，生命周期是每次模板渲染（template.merge(…)）</p>
</blockquote>

<h3 id="basepath">BASE_PATH</h3>
<blockquote>
  <p>仅WEB模块提供的全局常量，其值为servletContext.getContextPath()。</p>
</blockquote>

<h3 id="servletcontext">SERVLET_CONTEXT</h3>
<blockquote>
  <p>仅WEB模块提供的全局常量，Web容器提供的的ServletContext的一个实例。</p>
</blockquote>

<h2 id="lib-assertwim">标准库：lib-assert.wim</h2>

<blockquote>
  <p>位置: webit-script-[version].jar。(1.4.0版本以上) 这是一个用于模版内测试的库，API类似于junit。</p>
</blockquote>

<blockquote>
  <p>使用方法：</p>
</blockquote>

<pre>@modules +='''
  lib-assert.wim
'''
</pre>

<ul>
  <li>assertTrue(Object)  推测值为 true</li>
  <li>assertFalse(Object)  推测值为 false</li>
  <li>assertNull(Object)  推测值为 null</li>
  <li>assertNotNull(Object)  推测值不是 null</li>
  <li>assertSame(Object expected, Object actual)  推测两个值是同一个实例（相当于 ==）</li>
  <li>assertNotSame(Object expected, Object actual)  推测两个值不是同一个实例（相当于 !=）</li>
  <li>assertEquals(Object expected, Object actual)  推测两个值相等（使用.equals()方法判断）</li>
  <li>assertArrayEquals(Object expected, Object actual)  推测两个数组内容相同</li>
</ul>

<h2 id="lib-typewim">标准库：lib-type.wim</h2>

<blockquote>
  <p>位置: wit-tools-[version].jar。(1.0.0版本以上)，用于判断值的类型。</p>
</blockquote>

<blockquote>
  <p>使用方法：</p>
</blockquote>

<pre>@modules +='''
  lib-type.wim
'''
</pre>

<ul>
  <li>is_array(Object)  是否是数组</li>
  <li>is_bool(Object)  是否是Boolean</li>
  <li>is_function(Object)  是否是可调用的函数</li>
  <li>is_callable(Object)  等同于<code>is_function</code>， 是否是可调用的函数</li>
  <li>is_null(Object)  是否是null</li>
  <li>is_number(Object)  是否是数字</li>
</ul>

<h2 id="lib-tldwim">类型库：lib-tld.wim</h2>

<blockquote>
  <p>位置: wit-tools-[version].jar。(1.0.0版本以上)，提供对JSP TagLib Function。</p>
</blockquote>

<blockquote>
  <p>使用方法：</p>
</blockquote>

<pre>[global]
registers+=tld-demo

[tld-demo: org.febit.wit.tools.tld.TLDGlobalRegister]
checkAccess=false
tld=
prefix=
</pre>

<h2 id="lib-cachewim">标准库：lib-cache.wim</h2>

<blockquote>
  <p>位置: wit-tools-[version].jar。(1.0.0版本以上)，提供对片段缓存的支持。</p>
</blockquote>

<ul>
  <li>cache(key, func, …func_args)  其中key，func_args为可选参数, 缓存函数func执行后的返回结果以及输出内容，同时输出并缓存。当存在缓存时，将直接返回缓存中的返回值，输出缓存中的输出，不会再次执行指定函数。</li>
  <li>cache_remove(key)  移除指定key的缓存。</li>
  <li>cache_clear()  移除所有缓存，缺省不提供，需要额外配置</li>
</ul>

<blockquote>
  <p>使用方法：</p>
</blockquote>

<pre>@modules +='''
  lib-cache.wim
'''
</pre>

<h4 id="section-2">配置</h4>

<pre>## 注册全局函数
[org.febit.wit.tools.cache.CacheGlobalRegister]
# 函数注册的名称，默认为cache
name=cache
# 是否注册 cache_clear() 函数，默认为false
registCacheClear=true
# 选择Cache的供应组件
cacheProvider=simpleCacheProvider

## 配置自带的Cache的供应组件
[simpleCacheProvider]
# 缓存有效时间，单位: 毫秒
timeToLive =6000000
</pre>

<blockquote>
  <p>另外还可以选择第三方的Cache的供应组件</p>
</blockquote>

<pre>## 选择Cache的供应组件（略）

## 配置 Ehcache 供应组件
[ehcacheProvider]
# 使用的Ehcache的配置名称
cacheName=myEhcacheName
</pre>

<h4 id="section-3">在模版中使用</h4>

<pre class="brush: javascript;">&lt;%
// 嵌入函数的
cache(()-&gt;{
%&gt;
Hello Cache
&lt;%
return null;
});

var func = ()-&gt;{
%&gt;
Hello Cache
&lt;%
return null;
};

//外置函数同样可以
cache(func);
//清除缓存
cache_remove(func);

//自定义key的
cache("cache-func", func);
cache_remove("cache-func");

//带参数
cache(func, 1, 2);
cache(func, 3, 4);
cache_remove(func);

//自定义key，且带参数
cache("cache-func-1", func, 1, 2);
cache("cache-func-3", func, 3, 5);
cache_remove("cache-func-1");
cache_remove("cache-func-3");

//清空缓存
cache_clear();

%&gt;
</pre>

<h2 id="section-4">自定义函数库</h2>

<blockquote>
  <p>实际上自定义函数库很灵活，只需要像正常配置一样添加一个入口配置即可，后缀名可以任意，但建议使用“.wim”。自定义函数库的使用同标准库。</p>
</blockquote>

<blockquote>
  <p>PS: 目前标准库还很不完善，如果有任何意见或者建议 欢迎反馈。</p>
</blockquote>

</div>
<div class="footer">
版权所有 2013-2017 febit.org
</div>
</div>
<script type="text/javascript" src="js/app.js"></script>
<script type="text/javascript">SyntaxHighlighter.all();</script>
</body>
</html>
